package com.mueblesgl.proyecto.dao.mysql;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import com.mueblesgl.proyecto.dao.interfaces.ProduccionDAO;
import com.mueblesgl.proyecto.daofactory.MySqlDAOFactory;
import com.mueblesgl.proyecto.entidades.CostosPedido;
import com.mueblesgl.proyecto.entidades.ProcedimientoRecurso;
import com.mueblesgl.proyecto.entidades.Recurso;
import com.mueblesgl.proyecto.entidades.OrdenProduccion;
import com.mueblesgl.proyecto.entidades.OrdenProduccionProducto;
import com.mueblesgl.proyecto.util.Constantes;

public class MySqlProduccionDAO implements ProduccionDAO {

	
	@Override
	public Vector<OrdenProduccionProducto> consultarOrdenProducto(int idOrdenProduccion) {
		Vector<OrdenProduccionProducto> ordenes = new Vector<OrdenProduccionProducto>();
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "select * from ordenproduccion_producto where idordenproduccion = " + idOrdenProduccion + 
					";";
			System.out.println(query);
			ResultSet rs = stmt.executeQuery(query);
			
			OrdenProduccionProducto orden= new OrdenProduccionProducto();
			if (rs.next()) {
				
				orden = new OrdenProduccionProducto();
				orden.setIdOrdenProduccion(rs.getInt("idOrdenproduccion"));
				orden.setCantidad(rs.getInt("cantidad"));
				orden.setIdProducto(rs.getInt("idproducto"));
				
				ordenes.add(orden);
				
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return ordenes;
	}

	@Override
	public int registrarOrdenProduccion(OrdenProduccion ordenProduccion) {
		int idOrdenPedido = 0;
		
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();

			String sql = "INSERT INTO ordenproduccion(fechaproduccion, estadoproduccion, estado, usuario) "
					+ "VALUES (curdate()"
					
					+ ", '"
					+ Constantes.ESTADOPRODUCCION_PENDIENTE
					+ "', '"					
					+ Constantes.ESTADO_ACTIVO
					+ "', '"
					+ ordenProduccion.getUsuario() + "');";	
			
			
			stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
			ResultSet llaveGenerada = stmt.getGeneratedKeys();
		
			llaveGenerada.next();
			
			idOrdenPedido = llaveGenerada.getInt(1);
			
			String sql2 = "UPDATE ordenproduccion "
					+ "SET nombre = '"
					+ "OP-MueblesGL-"+idOrdenPedido

					+"' WHERE idordenproduccion = "+idOrdenPedido+";";
			
			stmt.executeUpdate(sql2);
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	

		return idOrdenPedido;
	}

	@Override
	public boolean registrarOrdenProduccionProducto(
			OrdenProduccionProducto ordenProduccionProducto) {
		
		int filas_afectadas = 0;

		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();

			String sql = "INSERT INTO ordenproduccion_producto(idordenproduccion, idproducto, cantidad, estado) "
					+ "VALUES ("
					+ ordenProduccionProducto.getIdOrdenProduccion()
					+ ", "
					+ ordenProduccionProducto.getIdProducto()
					+ ", "
					+ ordenProduccionProducto.getCantidad()
					+ ", '"
					+ Constantes.ESTADO_ACTIVO + "');";		
			
			filas_afectadas = stmt.executeUpdate(sql);
			
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (filas_afectadas == 1)
			return true;

		return false;
	}

	@Override
	public Vector<Recurso> obtenerRecursosDetalleRecurso(int idProducto) {
		Vector<Recurso> recursos = new Vector<Recurso>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();			
			Statement stmt = con.createStatement();
			
			String sql = "SELECT r.* FROM procedimiento_recurso pr, producto prod, procedimiento proced, recurso r "
					+ "WHERE pr.idprocedimiento = proced.idprocedimiento "
					+ "AND prod.idprocedimiento = proced.idprocedimiento "
					+ "AND r.idrecurso = pr.idrecurso "
					+ "AND prod.idproducto = " + idProducto + ";";
										
			ResultSet rs = stmt.executeQuery(sql);
			
			Recurso recurso;
			
			while(rs.next()) {
				recurso = new Recurso();

				recurso.setIdRecurso(rs.getInt("idrecurso"));
				recurso.setNombre(rs.getString("nombre"));
				recurso.setIdUnidad(rs.getInt("idunidad"));
				recurso.setCantidad(rs.getDouble("cantidad"));
				
				recursos.add(recurso);
			}
					
		} catch (Exception e) {
			e.printStackTrace();
		}
		return recursos;
	}

	@Override
	public Vector<ProcedimientoRecurso> obtenerRecursosDetalleProcedimiento(int idProducto) {
		Vector<ProcedimientoRecurso> procedimientoRecursos = new Vector<ProcedimientoRecurso>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();			
			Statement stmt = con.createStatement();
			
			String sql = "SELECT pr.* FROM procedimiento_recurso pr, producto prod, procedimiento proced, recurso r "
					+ "WHERE pr.idprocedimiento = proced.idprocedimiento "
					+ "AND prod.idprocedimiento = proced.idprocedimiento "
					+ "AND r.idrecurso = pr.idrecurso "
					+ "AND prod.idproducto = " + idProducto + ";";
									
			ResultSet rs = stmt.executeQuery(sql);
			
			ProcedimientoRecurso procedimientoRecurso = null;
			
			while(rs.next()) {
				procedimientoRecurso = new ProcedimientoRecurso();

				procedimientoRecurso.setIdRecurso(rs.getInt("idrecurso"));
				procedimientoRecurso.setIdProcedimiento(rs.getInt("idprocedimiento"));
				procedimientoRecurso.setCantidad(rs.getInt("cantidad"));
				
				procedimientoRecursos.add(procedimientoRecurso);
			}
					
		} catch (Exception e) {
			e.printStackTrace();
		}
		return procedimientoRecursos;
	}

	@Override
	public Vector<OrdenProduccion> listarOrdenProduccion() {
		Vector<OrdenProduccion> ordenes = new Vector<OrdenProduccion>();
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "SELECT * FROM ORDENPRODUCCION WHERE estado = '" + Constantes.ESTADO_ACTIVO + "' ORDER BY fechaproduccion;";
					
			OrdenProduccion orden = null;
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) {
				orden = new OrdenProduccion();
				
				orden.setIdOrdenProduccion(rs.getInt("idordenproduccion"));
				orden.setFechaProduccion(rs.getString("fechaproduccion"));
				orden.setEstadoProduccion(rs.getString("estadoproduccion"));
				orden.setNombre(rs.getString("nombre"));
				orden.setUsuario(rs.getString("usuario"));
			
				
				ordenes.add(orden);
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}	
		return ordenes;
	

	}

	@Override
	public OrdenProduccion consultarOrden(int idOrdenProduccion) {
		OrdenProduccion orden = null;
		
		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();
			String query = "select * from ordenproduccion where idordenproduccion = " + idOrdenProduccion + ";";
			ResultSet rs = stmt.executeQuery(query);

			if (rs.next()) {
				orden = new OrdenProduccion();
				orden.setIdOrdenProduccion(rs.getInt("idOrdenproduccion"));
				orden.setNombre(rs.getString("nombre"));
				orden.setUsuario(rs.getString("usuario"));
				orden.setEstado(rs.getString("estado"));
				orden.setFechaProduccion(rs.getString("fechaproduccion"));
				orden.setEstadoProduccion(rs.getString("estadoproduccion"));
				
			}
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return orden;
	}

	@Override
	public boolean registrarCostosPedido(CostosPedido costopedido) {
		int filas_afectadas = 0;

		try {
			Connection con = MySqlDAOFactory.abrirConexion();
			Statement stmt = con.createStatement();

			String sql = "INSERT INTO COSTOSPEDIDO(MatPrima, Insumos, Materiales, depreciacion, mantenimiento,remuneracion,amortizacion,manoobra,costofijototal,costovartotal,costototal,estado) "
					+ "VALUES ("
					+ costopedido.getMatPrima()
					+ ", "
					+ costopedido.getInsumos()
					+ ", "
					+ costopedido.getMateriales()
					+ ", "
					+ costopedido.getDepreciacion()
					+ ", "
					+ costopedido.getMantenimiento()
					+ ", "
					+ costopedido.getManoObra()
					+ ", "
					+ costopedido.getAmortizacion()
					+ ", "
					+ costopedido.getManoObra()
					+ ", "
					+ costopedido.getCFT()
					+ ", "
					+ costopedido.getCVT()
					+ ", "
					+ costopedido.getCostoTotal()
					+ ", '"
					+ Constantes.ESTADO_ACTIVO
					+ "');";
			System.out.println(sql);				
			filas_afectadas = stmt.executeUpdate(sql);
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (filas_afectadas == 1)
			return true;

		return false;
	}

}
